﻿
/////////////////////////////////////////////////////////////////
//File: CategoryHandler.cs
//Description: 这是安全控制器，使用代理模式。只有需要授权的数据才从这里读取，非授权数据请直接调用服务类。
//             CRUD授权过程：1. C,U操作要检查输入的数据是否符合授权。
//                          2. R操作要先读出目标数据，然后检查数据是否符合授权。
//                          3. D操作要先进行R操作过滤，判断输入数据是否符合授权，然后只执行符合授权的删除，忽略不符合授权的操作。
//                             为了保存程序的简洁和数据库执行效率，R过滤可以在Sql中完成。
//             
//Copyright© 2011 Moliu
//History:
//  2011-3-22 23:04:35    MoLiu             1
//  2011-4-17 13:13:15    Moliu             2
//  2011-5-11 22:45:01    Moliu             3
/////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Security;
using System.Threading;
using MAF.Common;
using My.Blog.Domain.Entities;
using My.Blog.Domain.Interfaces;

namespace My.Blog.Business.Security
{
    public partial class CategorySafe : ICategory
    {

        #region ICategory 成员

        /// <summary>
        /// 
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public IList<CategoryInfo> ReadCategoriesByConditions(CategoryInfo info)
        {
            info = SetReadCategoriesPermission(info);
            return _This.ReadCategoriesByConditions(info);
        }



        /// <summary>
        /// 此方法无需权限控制
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public IList<CategoryInfo> ReadAncestorsByConditions(CategoryInfo info)
        {
            return _This.ReadAncestorsByConditions(info);
        }

        /// <summary>
        /// 移动节点
        /// </summary>
        /// <param name="sourceId"></param>
        /// <param name="targetId"></param>
        /// <param name="width"></param>
        /// <returns></returns>
        public int MoveCategoryTo(int sourceId, int targetId, int width)
        {
            if (!SecurityUtility.IsBlogAdmin && 0 == targetId)
                throw new SecurityException("找不到父分类");

            return _This.MoveCategoryTo(sourceId, targetId, width);
        }

        #endregion

        #region Private Method
        /// <summary>
        /// 
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        private CategoryInfo SetReadCategoriesPermission(CategoryInfo info)
        {
            if (null == info) { info = new CategoryInfo(); }
            info.IsPublished = true;

            // 权限判断
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()) || SecurityUtility.IsBlogAdmin)
            {
                info.IsPublished = false;
            }

            return info;
        }
        #endregion
    }
}
    